EL 简介
表达式语言(Expression Language),简称EL,是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作,通常与JSTL一同使用。EL在得到某个数据时,会自动进行数据类型的转换。
EL 语法
EL表达式以“${”开始,以“}”作为结束:1
${EL表达式}
注意:由于EL表达式的语法是以
${
开头,所以如果在JSP网页中要显示${
字符串,必须在前面加上\
符号,即\${
或写成${‘${’}
。
禁用 EL
要使用EL表达式,Web服务器必须能够支持Servlet2.4/JSP2.0。由于JSP2.0以前的版本不支持EL,所以为了与低版本的环境兼容,JSP提供了以下三种禁用EL的方法。
使用斜杠
最简单的方法就是使用斜杠符号,其语法格式如下:1
\${EL表达式}
使用page指令
使用JSP的page指令也可以禁用EL表达式,其语法格式如下:1
<%@ page isELlgnored="true"%>
配置web.xml
在web.xml文件中配置1
2
3
4
5
6<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
EL 运算符
EL 提供“.”、“[]”运算符、算术运算符、逻辑运算符、关系运算符、条件运算符以及empty运算符。
[]和.运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,则可以利用[]或者.运算符来访问该属性。其语法格式如下:1
2${object["propertyName"]}
${object.propertyName}
注意:
1、如果propertyName
不是有效的Java变量名,只能使用[]
运算符。
2、当对象的属性名中包括一些特殊的字符(如-
或.
)时,只能使用[]
运算符。
算术运算符
EL提供以下五种算术运算符:
运算符 | 功能 | 示例 | 结果 |
---|---|---|---|
+ | 加 | ${1+1} | 2 |
- | 减 | ${2-1} | 1 |
* | 乘 | ${10*10} | 100 |
/或div | 除 | ${1/0}或${1 div 0} | Infinite |
%或mod | 求余 | ${1%0}或${1 mod 0} | 抛出异常 |
注意:EL的“+”运算符和Java中的“+”运算符不同,它不能实现两个字符串之间的连接;如果使用EL的“+”运算符连接两个可以转换为数值型的字符串,EL则可以自动将这两个字符串转换为数值型,再进行加法运算。
逻辑运算符
逻辑运算符的条件表达式的值必须是Boolean
型或是可以转换为Boolean
型的字符串,并且返回的结果也是Boolean
型。
运算符 | 功能 |
---|---|
&& 或 and | 与 |
|| 或 or | 或 |
! 或 not | 非 |
关系运算符
在EL中提供六种关系运算符,这六种关系运算符不仅可以用来比较整数和浮点数,还可以用来比较字符串,返回的结果为Boolean
型。
运算符 | 功能 |
---|---|
== 或 eq | 等于 |
!= 或 ne | 不等于 |
< 或 lt | 小于 |
> 或 gt | 大于 |
<= 或 le | 小于等于 |
>= 或 ge | 大于等于 |
条件运算符
在EL中进行简单的条件运算,可以通过条件运算符实现,其语法格式如下:1
${条件表达式 ? 表达式1 : 表达式2}
说明:
条件表达式:用于指定一个条件表达式,该表达式的值为Boolean
型,可以由关系运算符、逻辑运算符和empty
运算符组成。如果条件表达式为真,则返回表达式1的值,否则返回表达式2的值。
empty运算符
empty
运算符用来检查某一个值是否为null
或empty
,其语法格式为:1
${empty X}
如果X为null,或者说X是一个长度为0的字符串,那么该表达式将返回true,如果X是一个空Map、空数组、或空集合,它们将返回true,否则返回false。
EL 隐式对象
在JSP页面中,可以利用JSP脚本来访问JSP隐式对象。但是,在免脚本的JSP页面中,则不可能访问这些隐式对象。EL允许通过提供一组自己的隐式对象来访问不同的对象。
对象 | 描述 |
---|---|
pageContext | 页面上下文对象,它包含了所有其他的JSP隐式对象 |
initParam | 用于获取Web应用初始化参数的值 |
param | 用于获取请求参数的值,应用在参数值只有一个的情况 |
paramValues | 用于获取请求参数,应用在参数值有多个的情况 |
header | 用于获取HTTP请求的header值 |
headerValues | 用于获取HTTP请求的header值 |
cookie | 用于访问由请求设置的cookie |
applicationScope | 用于返回包含application范围内的属性值的集合,返回值为java.util.Map对象 |
sessionScope | 用于返回包含session范围内的属性值的集合,返回值为java.util.Map对象 |
requestScope | 用于返回包含request范围内的属性值的集合,返回值为java.util.Map对象 |
pageScope | 用于返回包含page范围内的属性值的集合,返回值为java.util.Map对象 |
initParam
initParam对象用于获取Web应用初始化参数的值。1
2
3
4
5
6
7
8// web.xml文件中设置一个初始化参数
<context-param>
<param-name>domain</param-name>
<param-value>http://gongchuangsu.github.io</param-value>
</context-param>
// 应用EL获取初始化参数
${initParam.domain}
param 和 paramValues
param对象用于获取请求参数的值,应用在参数值只有一个的情况,返回的结果为字符串。1
2
3
4
5// 通过一个输入表单设置一个请求参数
<input name="username" value="gongchuangsu" type="text">
// 应用EL获取请求参数
${param.username}
paramValues对象用于获取请求参数,应用在参数值有多个的情况,返回的结果为数组。1
2
3
4
5
6
7
8// 通过复选框表单设置请求参数
<input name="favorite" value="看书" type="checkbox">
<input name="favorite" value="慢跑" type="checkbox">
<input name="favorite" value="游泳" type="checkbox">
<input name="favorite" value="登山" type="checkbox">
// 应用EL获取请求参数
爱好为:${paramValues.name[0]}${paramValues.name[1]}${paramValues.name[2]}${paramValues.name[3]}
注意:在应用
param
和paramValues
对象时,如果指定的参数不存在,则返回空的字符串,而不是返回null
。
header 和 headerValues
header对象用于获取HTTP请求的header值,当同一个header拥有多个不同的值的情况时,就必须使用headerValues对象。1
2// 应用EL表达式获取HTTP请求的header的connection属性
${header.connection}
cookie
cookie对象用于访问由请求设置的cookie。1
2
3
4
5
6
7
8// 通过response对象设置cookie对象
<%
Cookie cookie = new Cookie("username","gongchuangsu");
response.addCookie(cookie);
%>
// 应用EL获取cookie对象的值
${cookie.username.value}
applicationScope/sessionScope/requestScope/pageScope
applicationScope对象用于返回包含application范围内的属性值的集合,返回值为java.util.Map对象。1
2
3
4
5
6
7// 定义application范围内的属性
<%
application.setAttribute("username","gongchuangsu");
%>
// 应用EL获取application范围内的属性值
${applicationScope.username}
还可以访问JavaBean的属性值1
2
3
4
5
6
7// 定义一个JavaBean
<jsp:useBean id="user" scope="application" class="...">
<jsp:setProperty name="user" property="name" value="gongchuangsu"/>
</jsp:useBean>
// 应用EL获取JavaBean实例的name属性
${applicationScope.user.name}
sessionScope对象、requestScope对象、pageScope对象与applicationScope对象用法同理。
保留的关键字
EL中保留的关键字如下表所示:
and | eq | gt |
instanceof | div | or |
le | false | empty |
not | lt | ge |
参考资料
1、Java Web 从入门到精通
2、Servlet、JSP和Spring MVC初学指南